Repository navigation
feat(permit): 增加跨机受管对端的票据代理 - #178
Merged
Merged
Conversation
Kucell
pushed a commit
that referenced
this pull request
Nov 9, 2026
原语变更与 PR #178 的票据代理是不同改动面,合入顺序不影响可读性。 正文写明本 PR 只提供纯逻辑原语,不装配、不开 socket、不接线, 且跨机信任的 Owner 门未解除。
Kucell
added a commit
that referenced
this pull request
Nov 9, 2026
* feat(permit): 增加远端对端身份原语与逐调用 authority 闸门 跨机受管许可链需要一种不能与本机 managed caller 身份互换的远端对端身份。 本提交新增两个纯逻辑原语: - lib/governed/remote-peer-trust.js:校验钉住的信任配置,逐字段核验远端签名事实 (钉住公钥、实例、epoch、宿主进程绑定、连接与 TLS 密钥绑定、挑战、新鲜度、 钟差、scope 包含),产出 kind = remote-peer 的不透明远端对端对象。 - lib/governed/remote-peer-session.js:单连接会话(挑战握手、挑战一次性、请求与 票据绑定、序号严格递增、重放登记不淘汰而 fail-closed、生命周期),以及每次调用 都要经过的逐调用 authority 闸门(会话状态、peer epoch、权威 lease 与 fencing、 撤销新鲜度、票据绑定、请求绑定、截止时间裁剪到 lease 剩余寿命)。 时间上界按 R5 冻结(握手 5s、事实龄 1s、票 2s、请求 5s、撤销陈旧 15s、钟差 2s): 信任配置可收紧,放宽一律拒绝而非静默截断。所有拒绝都带稳定拒绝码与出错字段名, 没有部分接受路径。 对应裁定:D-M053-MS008-P009-R1-TRUSTED-W-OPEN、R2R3-CONNECTION-TOPOLOGY-OPEN、 R4-TRUSTED-CONTEXT-OPEN、R5-TIMING-REVOCATION-OPEN、 D-M053-MS008-G0-CONNECTION-BINDING-BASIS-OPEN、D-M053-MS008-G0-A-SCOPE-NARROW-OPEN。 测试:node --test tests/governed/remote-peer-primitives.test.js 为 65/65 通过。 边界:本提交不签名、不签发许可、不开 socket、不涉及 Windows 设备动作、服务/ACL/ 账号或桌面敏感操作;两个原语尚未接入 permit-bridge 装配层,装配层是独立切片。 * docs(pr): 记录远端对端原语的 PR 正文与边界口径 原语变更与 PR #178 的票据代理是不同改动面,合入顺序不影响可读性。 正文写明本 PR 只提供纯逻辑原语,不装配、不开 socket、不接线, 且跨机信任的 Owner 门未解除。 --------- Co-authored-by: cortex-agent <cortex-agent@local>
Kucell
marked this pull request as ready for review
November 9, 2026 02:20
added 4 commits
November 9, 2026 10:21
票据此前只能在本机铸造并只发给本机已验证对端,跨机对端即使能到达签发端也永远拿不到票据。 新增票据代理:独立的回环监听器,按部署侧钉住的公钥做挑战握手, 握手成功后为该远端对端铸造一张绑定其签名身份事实的票据并当场交付。 远端对端的票据与本机对端的票据走同一条端点路径,仍是一次性的。
就绪输出的字段集合是既有契约,未配置远端对端时不应多出字段。 改为只有票据代理确实启动时才报告 agentPort,其余部署的输出逐字不变。 补充用例覆盖有代理与无代理两种就绪输出形状。
票据代理只绑回环,跨机可达性依赖承载。本轮取证的承载是既有 SSH 隧道 + 反向转发,契约 D-AUTH-001 v1.2.1 §9.1.2 已把它显式标注为测试域专用: 可用性依赖 SSH 会话与端口转发存活,对端进程事实的可核实性受限于通道本身。 生产承载尚未选定:契约列出候选与待评估项,候选不是决定,取舍属 Owner 裁定。 本 PR 的结论上限仍是测试域可签发、可取件、可验签。
代理只绑回环,跨机可达性依赖承载。文件头写明 SSH 反向转发承载是测试域专用, 生产承载未选定,结论上限是测试域可签发、可取件、可验签。
Kucell
force-pushed
the
feat/m053-r2-r6-remote-ticket-agent-20261109
branch
from
November 9, 2026 02:21
877125c to
5848bee
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
范围
票据此前只能在签发端进程内铸造、且只发给本机已验证的对端(
tickets.mint(assembly.peerIdentity)),端点侧只接受与本机 pin 身份一致的票据。因此跨机受管对端即使能到达签发端,也永远拿不到票据。
本 PR 增加票据代理:签发端进程内一个独立的回环监听器。
lib/coordination/permit-ticket-agent.js:票据代理。信任根来自部署侧钉住的公钥(peers参数),绝不由对端自报;服务端签发一次性挑战,对端用钉住的私钥签名握手事实(字节域前缀
cortex.permit-ticket-agent-handshake.v1),验签通过后为该远端对端铸造一张绑定其签名身份事实的票据并在握手响应里当场交付。挑战一次性:成功或失败都用掉。
lib/coordination/permit-remote-peer-registry.js:远端对端登记表。本机对端的身份是全生命周期 pin;远端对端的身份只在票据可达的窗口内存在,随票据过期一起失效。比较规则复用端点既有的
identityMatches,避免一座桥里出现两套「同一个对端」的定义。lib/coordination/permit-remote-peer-client.js:远端对端一侧的握手客户端(只用node:crypto)。permit-bridge-host.js:端点接受「本机 pin 对端 或 仍在登记表内的远端对端」的票据;配置了
remotePeers时桥内启动票据代理。permit-bridge-service.js/permit-bridge-service-cli.js:配置项remotePeerTrustFile(部署侧信任文件)与
agentPort;就绪输出仅在票据代理实际启动时增加agentPort(未配置信任文件时就绪输出逐字不变)。
验证
node --test tests/coordination/permit-ticket-agent.test.js→ 13/13。node --test tests/coordination/permit-bridge.test.js→ 21/21(未受影响)。node --test tests/coordination/permit-bridge-{host,service,ticket,ticket-binding,bounds}.test.js→ 34/34。node --test tests/commands/permit-bridge-service-cli.test.js→ 8/8(含新增「有代理时报告 agentPort」用例)。node scripts/check-l3-boundary.js→ 0 violations。(
messageJson/signatureBase64/fingerprint/sequence/deadlineMs/ 11 个投影字段 /permitId);承载形态:测试域专用(不是生产路径)
(
ssh -N -R 127.0.0.1:18080:127.0.0.1:<permitPort> -R 127.0.0.1:18081:127.0.0.1:<agentPort>)。端口转发状态,且对端进程事实的可核实性受限于通道本身。它适合测试域取证,不适合作为生产准入路径。
持久隧道 / 承载与信任解耦)——候选不是决定,取舍属 Owner 级书面裁定(§9.1.4「批什么」④⑤)。
不宣称受保护身份已验证。
归 Owner 门(INV-13 / G-Q2 未解除)。
已知事项
pid/startToken/commandDigest由对端签名,属于「对端对自己身份的承诺」,签发端只能验证签名,不能验证这些进程事实的真实性。
不代表跨机信任已被接受。
ERR_DESKTOP_NOT_FREE),因此每轮验证用独立测试域。
issued_at_ms的缺口属另一条线(feat(permit): 增加 desktop_authority 授权许可的签发原语 #177 已记录);契约侧已由 v1.2.1 回填该字段表,本 PR 未改动消息结构。
边界
不签发许可、不改许可消息结构、不改票据一次性语义、不开非回环监听、不碰服务/ACL/账号、
不部署共享 broker、不改共享 broker 的服务名与身份配置。